from flask import Flask, jsonify, request, abort
from werkzeug.exceptions import HTTPException
import asyncio
import wind
import json
import db
import time

app = Flask(__name__)

class PrivateAssistant:
    def __init__(self):
        self.db = {
            1: {'name': 'Alice', 'age': 25},
            2: {'name': 'Bob', 'age': 30}
        }
        self.next_id = 3

    #######实际使用########
    # 获取客户端的命令
    def get_client_command(self):
        post_dict = request.get_json()
        
        ai_response = self.get_command_type(post_dict,"bd本地数据结构.txt")
        
        json_data = json.loads(ai_response)
        command_type = json_data['command_type']
        
        
        if command_type == 1:
            # AI查询
            # asyncio.run(self.stream_data())
            pass
        elif command_type == 2:
            # 发送消息
            pass
        elif command_type == 101:
            # 业务系统-操作
            
            pass
        elif command_type == 102:
            # 业务系统-数据查询
            db_obj = db.db()
            
            print(json_data['core_content'])
            res = db_obj.select_one(json_data['core_content'])
            
            if res['code'] == '0000':
                final_arr = res['data']
            else:
                print("未查到数据")
        
            print(res)
        else:
            print("###")
            
            
            
        # print(type(post_dict))
        return self.oput(1,'请求成功')


    
    # def res_to_ai_transfer_nl(self)

    
    
    
    
    # 获取命令类型
    def get_command_type(self,post_dict,file_path):
        
        main_content = post_dict['messages'][len(post_dict['messages']) - 1]['content']
        
        to_ai_content = '''
            一共有4种命令，分别是：
            1. **AI查询**：通常用于查询一般性的知识或信息，例如：“中国有多少个省？”
            2. **发送消息**：通常用于发送消息，例如：“发送邮件，发短信，钉钉，微信等”。
            101. **业务系统-操作**：用来执行特定的业务操作，例如：“添加任务，订会议室等”。
            102. **业务系统-数据查询**：用来需要查询特定的业务数据，例如：“查询某人的任务或业绩情况”，一般指只能在内容数据才能查询到的查询需求;
            根据用户输入的内容,输出内容，输出格式为json，举例：
            {
                "command_type":1,
                "ai_remark":"ai的备注",
                "business_module":"task",
                "operate_type":"store",
                "core_content":"sql语句"
            }
            
            business_module是业务系统标识，用来区分不同的业务模块，例如：任务是task，会议是metting等。
            operate_type是操作类型：有3种，增：store；删：destroy；改：update
            core_content为核心内容：通常为空，但是如果类型是101或者102的话，则根据数据结构，生成sql，并将其放在该字段内；特别注意，人员的姓名是在bd_sys_account的real_name字段里
            用户输入的内容：
        '''
        
        to_ai_content = to_ai_content + main_content
        
        
        # print(to_ai_content)
        wind_obj = wind.wind()
        # wind_obj.ai_list_file()
        # wind_obj.send_to_ai_by_file(to_ai_content,"bd本地数据结构.txt")
        # wind_obj.ai_truncate_list_file()
        
        ai_response = wind_obj.send_to_ai(to_ai_content)
        
        
        
        
        
        print(ai_response)
        return ai_response



    def oput(self,status,msg,data = None):
        
        return_json = {
            'status':status,
            'msg':msg,
            'data':data
        }
        
        return jsonify(return_json)
    
    def add_sql_struct(self,to_ai_content):
        
        to_ai_content = to_ai_content + """
            
            #############
            下面是数据结构，当类型为101或者102时；参考该数据结构，给出对应sql；其中人员的姓名是bd_sys_account表的real_name字段；
        """ 
        return to_ai_content    
    
    def stream_oput(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/event-stream')
        self.send_header('Cache-Control', 'no-cache')
        self.send_header('Connection', 'keep-alive')
        self.end_headers()
        
        for i in range(10):  # 示例：发送10个事件
            message = f"data: Message {i}\n\n"
            self.wfile.write(message.encode('utf-8'))
            self.wfile.flush()  # 确保立即发送
            time.sleep(1)  # 模拟处理时间
    
    
# 创建 PA 类的实例
pa_service = PrivateAssistant()

# 将 PA 类的方法绑定到 Flask 路由

@app.route('/get_client_command',methods=['POST'])
def get_client_command():
    return pa_service.get_client_command()


# 错误处理
@app.errorhandler(404)
def not_found(error):
    return jsonify({'error': 'Not found'}), 404

@app.errorhandler(400)
def bad_request(error):
    return jsonify({'error': 'Bad request'}), 400

@app.errorhandler(HTTPException)
def handle_exception(e):
    # 通用 HTTP 错误处理
    return jsonify({'error': str(e)}), e.code



if __name__ == '__main__':
    app.run(debug=True)